package Server;

/*
 * File:    Servidor.java
 * Coms:    Servidor que siempre está a la escucha para recibir cliente:
 * 		   Para negociar sobre la publicación de imagenes en vallas publicitarias.
 * 		   Crea hilos independientes para gestionar las consultas.
 */

/**
 * @author Daniel Cabrera Ebana - 686013
 * @author Alberto Sanchez Romero - 662385
 * @since 
 */

import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Servidor {

	/**
	 * @param args
	 * args[0] = Puerto de escucha 
	 * args[1] = Dirección IP Banco
	 * args[2] = Puerto Banco
	 */
	public static void main(String[] args) {

		/** Ruta donde se encuentran las imagenes */

		String appPath = System.getProperties().getProperty("user.dir");
		File directorio = new File(appPath + "/img");
		
		//boolean continuar = true;
		// comprobar que existen parametros de entrada
		if (args.length != 3) {
			System.out
					.println("Porfavor introduce : puertoServidor ipBanco puertoBanco");
			System.exit(0);
		}

		int SERVER_PORT = Integer.parseInt(args[0]);

		String ipBanco = args[1];

		int puertoBanco = Integer.parseInt(args[2]);

		System.out.println("Escuchando en el puerto " + SERVER_PORT);
		System.out.println("---Esperando a que se conecten los clientes---");

		ServerSocket serverSocket = null; // para escuchar
		Socket clientSocket = null; // uno por cliente

		// Inicializar el socket del cliente con el que se va
		// a comunicar el servidor, es decir se acepta la
		// conexión de un cliente al servidor mediante
		// el método accept()
		serverSocket = creaListenSocket(SERVER_PORT);

		// Crear e iniciar monitor
		GestorRecursos monitorRecursos = new GestorRecursos();

		// Crear e iniciar la VallaPrincipal, VallaSecundaria,
		// PaneldeInformacion y el control de apagado
		Thread valla1 = new Thread(new VallaPrincipal(directorio, monitorRecursos));
		Thread valla2 = new Thread(new VallaSecundaria(directorio, monitorRecursos));
		Thread panelInfo = new Thread(new PanelInformacion(monitorRecursos));
		Thread controlApagar = new Thread(new ControlApagado(monitorRecursos));

		controlApagar.start();
		panelInfo.start();
		valla1.start();
		valla2.start();

		// Variable para seguir dentro del servidor
		boolean continuar=true;
		try {
			while (continuar) {
				clientSocket = creaClientSocket(serverSocket);
				monitorRecursos.addCliente();
				Thread negociar = new Thread(new ThreadServidor(clientSocket,
						monitorRecursos, ipBanco, puertoBanco));
				negociar.start();
				//En caso de que se haya pulsado el botón de apagado
				if(monitorRecursos.getCerrarServidor()){
					continuar = monitorRecursos.getCerrarServidor();
				}
				
				
			}

		}
		
		
		catch (java.lang.OutOfMemoryError e) {

			System.out.println("No se aceptan mas");
			Thread.currentThread().interrupt();
		}

	}

	private static ServerSocket creaListenSocket(int serverSockNum) {
		ServerSocket server = null;

		try {
			server = new ServerSocket(serverSockNum);
		} catch (IOException e) {
			System.err.println("Problems in port: " + serverSockNum);
			System.exit(-1);
		}
		return server;
	}

	// Establece conexi�n con server y devuelve socket
	// Aborta programa si no lo logra
	private static Socket creaClientSocket(ServerSocket server) {
		Socket res = null;

		try {
			res = server.accept();
		} catch (IOException e) {
			System.err.println("Accept failed.");
			System.exit(1);
		}
		return res;
	}

	private static void sleepy(int i) {

		try {
			Thread.sleep(i * 1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}

}
